#include <iostream>
#include <cstdlib>
#include <string>   // pour std::string
#include <fstream>  // pour les fichiers
#define ECART 0.0001
#define DEFAULT_VALUE 0
using namespace std;

void affiche(int ** res,int ncols, int nrows){//on a fine d'ecouler oute l'eau
    for(int j = 0;j<nrows;j++){
        for(int i=0; i<ncols; i++){
            cout<<res[j][i]<<" ";
        }
        cout<<endl;
    }
}
void ecoulement(int ** res, int ** leMNT, int lig, int col, int nrows, int ncols,int val){
    if(col >= 0 && col < ncols && lig >= 0 && lig < nrows){
        //col et lig valide
        if(res[lig][col] == 0){
            //premiere fois qu'on passe dnas la case
            res[lig][col]++;
            res[lig][col]+=val;
            val = res[lig][col];
            //premiere fois dnas la case donc premiere fois qu'on donne au suivant'

        }
        else{
            //c'ets pas la premiere fois et on ne dois rajouter soit un soit val

                res[lig][col]+=val;


        }


       // affiche(res,ncols,nrows);
       // cout<<endl;cout<<endl;cout<<endl;
        int dir = leMNT[lig][col];
        switch(dir){
        case 0 : /* do nothing */ break;
        case 1 :
            //hautgauche
            ecoulement(res,leMNT,lig-1,col-1,nrows,ncols,val  );
            break;
        case 2 :
            //haut
            ecoulement(res,leMNT,lig-1,col,nrows,ncols,val  );
            break;
        case 3 :
            //hautdroit
            ecoulement(res,leMNT,lig-1,col+1,nrows,ncols,val  );
            break;
        case 4 :
            //droit
            ecoulement(res,leMNT,lig,col+1,nrows,ncols,val  );
            break;
        case 5 :
            //basdroit
            ecoulement(res,leMNT,lig+1,col+1,nrows,ncols,val  );
            break;
        case 6 :
            //bas
            ecoulement(res,leMNT,lig+1,col,nrows,ncols,val  );
            break;
        case 7 :
            //basgauche
            ecoulement(res,leMNT,lig+1,col-1,nrows,ncols,val  );
            break;
        case 8 :
            //gauche
            ecoulement(res,leMNT,lig,col-1,nrows,ncols,val  );
            break;
        }
    }
    else{
        //do nothing
    }
}

int ** initResPhIII(int ncols, int nrows, int default_value){
    int ** res = new int*[nrows];
    for(int i = 0 ; i< nrows;i++){
        res[i] = new int[ncols];
    }

    //init a 0;
    for(int lig= 0; lig < nrows; lig++){
        for (int col =0; col<ncols
             ; col++) {
            res[lig][col] = default_value;
        }
    }
    return res;
}


int main(int argc, char ** argv){
    int ** leMNT;
    int ncols, nrows, xllcorner, yllcorner, cellsize;
    int NODATA_value;
    ifstream file("testPHIII.txt", ios::in);
    string trash;
    if(file){
        cout<<"fichier ouvert correctement"<<endl;
        file >> trash;
        file >> ncols;
        file >> trash;
        file >> nrows;
        file >> trash;
        file >> xllcorner;
        file >> trash;
        file >> yllcorner;
        file >> trash;
        file >> cellsize;
        file >> trash;
        file >> NODATA_value;
        leMNT =new int*[nrows]; // nb de ligne et donc taille d'une colonne
        for(int i= 0; i< nrows ; i++){
            leMNT[i] = new int[ncols]; // allocation d'une ligne
        }
        // on passe au remplissage du tableau
        for(int lig=0; lig<nrows ;lig++){
            for(int col= 0; col < ncols ; col++){
                file >> leMNT[lig][col];
                //cout<<leMNT[lig][col]<<" ";
                //attention les coordonnées sont inversées , en effet
                // de part la création, on est obligé de mettre
                // l'ordonnée(lig) en premier dans l'allocation
                // et l'abscisse en second
                // faire attention pour plus tard
            }
            //cout<<endl;
        }
    }
    else{
        cout<<"impossible d'ouvrir le fichier"<<endl;
    }


    //on a besoin du calcul de la phase deux ouvert dnas phaseII.txt

    int ** res  = initResPhIII(ncols,nrows,DEFAULT_VALUE);
    for (int lig = 0 ; lig< nrows ;lig++){
        for(int col  = 0 ; col < ncols;col++){
            //idee : pour toute les cases suivre le chemin de l'eau et ajouter +1 a chaque fois
            if(res[lig][col]==0){
                ecoulement(res,leMNT,lig,col,nrows,ncols,0);
            }
        }

    }
    //on test l'ajout de 5 litre sur la première case
    ecoulement(res,leMNT,0,0,nrows,ncols,5);
    affiche(res,ncols,nrows);

}
